// 用户模型定义 - Sequelize
const 加密 = require('../zh/后端/核心/加密');

// 创建一个函数来获取用户模型，确保在数据库连接后调用
function 获取用户模型() {
  // 动态导入数据库连接，确保数据库已经连接
  const { 获取数据库实例, 数据类型 } = require('../config/db');
  const 数据库实例 = 获取数据库实例();
  
  if (!数据库实例) {
    throw new Error('数据库实例未初始化，请确保数据库已连接');
  }

  // 检查模型是否已经存在
  if (数据库实例.models['用户']) {
    return 数据库实例.models['用户'];
  }

  // 定义模型属性
  const 属性 = {
    id: {
      type: 数据类型.整数,
      primaryKey: true,
      autoIncrement: true
    },
    // 用户名（唯一标识）
    用户名: {
      type: 数据类型.字符串,
      allowNull: false,
      unique: true,
      validate: {
        notEmpty: true,
        len: [3, 50]
      }
    },
    
    // 密码（存储哈希后的密码）
    密码: {
      type: 数据类型.字符串,
      allowNull: false
    },
    
    // 用户昵称
    昵称: {
      type: 数据类型.字符串,
      validate: {
        len: [0, 100]
      }
    },
    
    // 电子邮箱
    邮箱: {
      type: 数据类型.字符串,
      allowNull: false,
      unique: true,
      validate: {
        notEmpty: true,
        isEmail: true
      }
    },
    
    // 用户角色
    角色: {
      type: 数据类型.枚举,
      values: ['用户', '管理员', '超级管理员'],
      defaultValue: '用户'
    },
    
    // 用户状态
    状态: {
      type: 数据类型.枚举,
      values: ['活跃', '禁用', '待验证'],
      defaultValue: '活跃'
    },
    
    // 头像URL
    头像: {
      type: 数据类型.字符串,
      defaultValue: null
    },
    
    // 最后登录时间
    最后登录时间: {
      type: 数据类型.日期时间,
      defaultValue: null
    },
    
    // 登录次数
    登录次数: {
      type: 数据类型.整数,
      defaultValue: 0
    }
  };
  
  // 定义模型选项
  const 选项 = {
    tableName: 'users',
    timestamps: true,
    createdAt: '创建时间',
    updatedAt: '更新时间'
  };
  
  // 定义模型
  const 模型 = 数据库实例.define('用户', 属性, 选项);
  
  // 密码加密钩子 - 创建前
  模型.beforeCreate(async (用户实例) => {
    if (用户实例.changed('密码')) {
      用户实例.密码 = await 加密.生成哈希(用户实例.密码, 10);
    }
  });
  
  // 密码加密钩子 - 更新前
  模型.beforeUpdate(async (用户实例) => {
    if (用户实例.changed('密码')) {
      用户实例.密码 = await 加密.生成哈希(用户实例.密码, 10);
    }
  });
  
  // 实例方法 - 检查密码
  模型.prototype.检查密码 = async function(输入密码) {
    return await 加密.验证哈希(输入密码, this.密码);
  };
  
  // 实例方法 - 更新登录信息
  模型.prototype.更新登录信息 = async function() {
    this.最后登录时间 = new Date();
    this.登录次数 += 1;
    return await this.save();
  };
  
  // 静态方法 - 根据用户名查找用户
  模型.按用户名查找 = async function(用户名) {
    return await this.findOne({ where: { 用户名 } });
  };
  
  // 静态方法 - 根据邮箱查找用户
  模型.按邮箱查找 = async function(邮箱) {
    return await this.findOne({ where: { 邮箱 } });
  };
  
  // 虚拟字段 - 显示名称
  模型.prototype.get显示名称 = function() {
    return this.昵称 || this.用户名;
  };
  
  // 移除密码字段的方法
  模型.prototype.toJSON = function() {
    const 用户对象 = this.toObject();
    delete 用户对象.密码;
    return 用户对象;
  };
  
  return 模型;
}

// 导出获取用户模型的函数
module.exports = 获取用户模型;